package managed.bean;

import com.marlboroug.articles.ArticlesManagerRemote;
import com.marlboroug.articlesbyauthors.ArticlesByAuthorsRemote;
import com.marlboroug.categories.CategoriesManagerRemote;
import com.marlboroug.entity.Articles;
import com.marlboroug.entity.Categories;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 * Gestion des éditeurs.
 *
 * @author Cyril Schumacher
 */
@ManagedBean
@SessionScoped
public class CategoryManager implements Serializable {
    // <editor-fold defaultstate="collapsed" desc="Membres.">
    /**
     * Gestion des catégories.
     */
    @EJB
    private CategoriesManagerRemote _categoriesManager;
    @EJB
    ArticlesManagerRemote articlessManager;
    /**
     * Gestion des articles avec les auteurs.
     */
    @EJB
    private ArticlesByAuthorsRemote _articlesManager;
    /**
     * Informations sur la catégorie.
     */
    private Categories category;
    /**
     * Liste des catégories existantes.
     */
    private ArrayList<Categories> categories;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Accesseurs/Mutateurs.">
    /**
     * Obtient la catégorie sélectionné par l'utilisateur.
     *
     * @return Retourne une catégorie.
     */
    public Categories getCategory() {
        return category;
    }

    /**
     * Définit la catégorie sélectionné par l'utilisateur.
     *
     * @param category Informations d'une catégorie.
     */
    public void setCategory(Categories category) {
        this.category = category;
    }

    /**
     * Obtient la liste des categories existants.
     *
     * @return Retourne une liste des categories.
     */
    public ArrayList<Categories> getCategories() {
        return categories;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Privées.">
    private void _refresh() {
        categories = new ArrayList<>(_categoriesManager.findAll());
    }

    // </editor-fold>
    /**
     * Supprime une catégorie.
     *
     * @param id Identifiant de la catégorie.
     */
    public void delete(Long id) {
        int id_article = 0;
        List<Articles> verifArticle = articlessManager.ArticlesFindCategory(5, id);
        for (Articles m : verifArticle) {
            id_article = m.getIDarticles().intValue();
        }
        if (id_article == 0) {
            _categoriesManager.delete(Long.valueOf(id));
            _refresh();
        } else {
            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la suppression.", null));
        }

    }

    /**
     * Met à jour une catégorie.
     *
     * @param category Catégorie.
     */
    public void update(Categories category) {
        if (_categoriesManager.update(category)) {
            _refresh();
        } else {
            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la mise à jour.", null));
        }
    }

    /**
     * Créer une catégorie.
     *
     * @return Retourne une chaîne de caractère pour le contrôle JSF.
     */
    public String create() {
        if (_categoriesManager.create(getCategory())) {
            _refresh();
            setCategory(new Categories());
            return "success";
        } else {
            return "failure";
        }
    }

    /**
     * Initialise la classe.
     */
    @PostConstruct
    public void initialize() {
        setCategory(new Categories());
        _refresh();
    }
    // </editor-fold>
}
